/*
 * @Author: DUST
 * @Date: 2023-06-29 17:54:14
 * @LastEditors: DUST
 * @LastEditTime: 2023-07-03 14:13:15
 * @FilePath: \koa-node-ts\webpack\webpack.config.base.js
 * @Description: 
 * undefined
 */
const path = require('path')
const webpack = require('webpack')
const nodeExternals = require('webpack-node-externals')
const {
  CleanWebpackPlugin
} = require('clean-webpack-plugin')
const nodePolyfillWebpackPlugin = require("node-polyfill-webpack-plugin")
const ProgressBarWebpackPlugin = require('progress-bar-webpack-plugin')
const dotenv = require("dotenv");

// 读取 .env 并生成 webpack.DefinePlugin 所需对象
// process.cwd() 返回的是Node.js进程启动时的工作目录
const env = dotenv.config({
  path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV}`)
}).parsed;

console.log("当前配置：", env)

// 生成对象（类型转换）
const envKeys = Object.keys(env).reduce((prev, next) => {
  if (['true', 'false'].includes(env[next])) {
    prev[`process.env.${next}`] = Boolean(env[next]);
  } else {
    prev[`process.env.${next}`] = JSON.stringify(env[next]);
  }
  return prev;
}, {});

const webpackConfig = {
  target: 'node', // koa项目仅在node环境下运行，因此设置称'node'
  entry: path.join(__dirname, '../index.ts'),
  output: {
    // 设置打包后的文件和位置
    filename: '[name].bundle.js',
    path: path.join(__dirname, '../dist')
  },
  // devtool: 'inline-source-map',
  module: {
    rules: [{
        // test指定的是规则生效的文件,意思是，用ts-loader来处理以ts为结尾的文件
        test: /\.ts$/,
        use: [
          // 配置babel
          {
            // 指定加载器
            loader: 'babel-loader',
            // 设置babel
            options: {
              // 设置预定义的环境
              presets: [
                [
                  // 指定环境插件
                  "@babel/preset-env",
                  // 配置信息
                  {
                    // targets: {
                    //   "chrome": "88"
                    // },
                    // 指定corejs的版本
                    "corejs": "3",
                    // 使用corejs的方式为按需加载
                    "useBuiltIns": "usage"
                  }
                ]
              ]
            }
          },
          'ts-loader'
        ],
        // use: 'ts-loader',
        exclude: /node_modules/
      },
      {
        test: /\.js|jsx$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env'],
            plugins: ['@babel/plugin-transform-runtime']
          }
        },
        // 尽量将 loader 应用于最少数量的必要模块，因此设置include
        // 只针对该目录下的js文件进行babel处理
        // include: path.join(__dirname, '../')
      },
    ]
  },
  resolve: {
    // modules: 告诉webpack哪些目录需要搜索去匹配解析
    modules: [path.join(__dirname, '../index.ts'), 'node_modules'],
    // extensions: 告诉webpack这些后缀文件需要去搜索匹配
    extensions: ['.js', '.json', '.ts', '.tsx', '.jsx'],
    alias: {
      // 设置别名指向对应目录
      '@': path.join(__dirname, '../app')
    }
  },
  externals: [nodeExternals()], // 排除对node_modules里的依赖进行打包
  plugins: [
    new CleanWebpackPlugin(), // 打包前清除输出目录
    new webpack.DefinePlugin(envKeys),
    // new webpack.DefinePlugin({
    //   // 定义环境变量，区分开发和生产环境
    //   // 具体详情可查看DefinePlugin文档
    //   'process.env.NODE_ENV':
    //     process.env.NODE_ENV === 'production'
    //       ? JSON.stringify('production')
    //       : JSON.stringify('development')
    // }),
    new nodePolyfillWebpackPlugin(),
    new ProgressBarWebpackPlugin(),
  ],
  // node下这些选项可以使最初为Node.js环境编写的代码，在其他环境（如浏览器）中运行
  node: {
    __filename: true,
    __dirname: true
  },
  // node: {
  //   // console: true,
  //   global: true,
  //   //process: true,
  //   // Buffer: true,
  //   __filename: true,
  //   __dirname: true,
  //   // setImmediate: true,
  //   // path: true
  // }
}

module.exports = webpackConfig